package es.gesfutbol.web;

import java.text.DateFormat;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import es.gesfutbol.dao.IEquipDao;
import es.gesfutbol.dao.IJugadorDao;
import es.gesfutbol.dao.IJugadorEnEquipDao;
import es.gesfutbol.domini.implementacio.Equip;
import es.gesfutbol.domini.implementacio.IdJugadorEnEquip;
import es.gesfutbol.domini.implementacio.Jugador;
import es.gesfutbol.domini.implementacio.JugadorEnEquip;

public class JugadorEnEquipsController extends MultiActionController{
	
	private IJugadorEnEquipDao jugadorEnEquipDao;

	private IEquipDao equipDao;
	
	private IJugadorDao jugadorDao;
	
	public IJugadorEnEquipDao getJugadorEnEquipDao() {
		return jugadorEnEquipDao;
	}

	public void setJugadorEnEquipDao(IJugadorEnEquipDao jugadorEnEquipDao) {
		this.jugadorEnEquipDao = jugadorEnEquipDao;
	}
	
	public IEquipDao getEquipDao() {
		return equipDao;
	}

	public void setEquipDao(IEquipDao equipDao) {
		this.equipDao = equipDao;
	}
	
	public IJugadorDao getJugadorDao() {
		return jugadorDao;
	}

	public void setJugadorDao(IJugadorDao jugadorDao) {
		this.jugadorDao = jugadorDao;
	}

	/**
	 * This is an overridden verison of initBinder method of Spring baseCommandController.
	 * It is used by Spring to register a custom editor for a String field coming in a 
	 * Http request. This lets you have any datatype in your command and not just String.
	 */
	protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder){
		binder.registerCustomEditor(Date.class, "baixa" ,new CustomDateEditor(DateFormat.getDateInstance(), true));
	}	
	
	public ModelAndView viewJugadorEnEquip(HttpServletRequest request,
			HttpServletResponse response){
	
		//Jugador actual.
		Jugador jugador = jugadorDao.findById(Long.valueOf(request.getParameter("idJugador")));
		List<Equip> equips = equipDao.findAll();
		
		//Llista dels equips en els que participa un jugador.
		List<JugadorEnEquip> jugadorEnEquips = jugadorEnEquipDao.findByIdJugadorDeproxy(jugador.getIdJugador());
		JugadorEnEquip jugadorEnEquip = new JugadorEnEquip();
		IdJugadorEnEquip idJugadorEnEquip = new IdJugadorEnEquip();
		idJugadorEnEquip.setEquip(new Equip());
		idJugadorEnEquip.setJugador(jugador);
		jugadorEnEquip.setId(idJugadorEnEquip);
		
		
		ModelMap modelMap = new ModelMap();
		modelMap.put("jugadorActual", jugador);
		modelMap.put("llistaJugadorEnEquips", jugadorEnEquips);
		modelMap.put("llistaEquips", equips);
		modelMap.put("nouJugadorEnEquip", jugadorEnEquip);
		modelMap.put("new", true);
		return new ModelAndView("administracion/jugadorEnEquips", modelMap);
		
	}
	
	@Transactional(readOnly = false)
	public ModelAndView delete(HttpServletRequest request,
			HttpServletResponse response){

		Jugador jugador = jugadorDao.findById(Long.valueOf(request.getParameter("idJugador")));
		Long idEquip = Long.parseLong(request.getParameter("idEquip"));
		JugadorEnEquip jugadorEnEquip = jugadorEnEquipDao.findJugadorEnEquipByJugadorIEquip(jugador.getIdJugador(),idEquip);

		jugadorEnEquipDao.delete(jugadorEnEquip);

		return new ModelAndView("redirect:viewJugadorEnEquip.htm?idJugador=" + jugador.getIdJugador()); 
	}
	
	public ModelAndView viewUpdate(HttpServletRequest request,
			HttpServletResponse response){
		
		Jugador jugador = jugadorDao.findById(Long.valueOf(request.getParameter("idJugador")));
		Long idEquip = Long.parseLong(request.getParameter("idEquip"));
		List<Equip> equips = equipDao.findAll();
		List<JugadorEnEquip> jugadorEnEquips = jugadorEnEquipDao.findByIdJugadorDeproxy(jugador.getIdJugador());

		//Cerquem el jugadorEnquip per idJugador i idEquip.
		JugadorEnEquip jugadorEnEquip = jugadorEnEquipDao.findJugadorEnEquipByJugadorIEquipDeproxy(jugador.getIdJugador(),idEquip);

		ModelMap modelMap = new ModelMap();
		modelMap.put("jugadorActual", jugador);
		modelMap.put("llistaJugadorEnEquips", jugadorEnEquips);
		modelMap.put("llistaEquips", equips);
		modelMap.put("nouJugadorEnEquip", jugadorEnEquip);
		modelMap.put("new", false);
		return new ModelAndView("administracion/jugadorEnEquips", modelMap);
	}
	
	public ModelAndView addOrUpdate(HttpServletRequest request,
			HttpServletResponse response, JugadorEnEquip jugadorEnEquip){
		jugadorEnEquipDao.saveOrUpdate(jugadorEnEquip);
		return new ModelAndView("redirect:viewJugadorEnEquip.htm?idJugador=" + jugadorEnEquip.getId().getJugador().getIdJugador());
	}
}